package verificaforcadasenha;

import java.util.ArrayList;
import java.util.Arrays;


/**
 *
 * @author Helanio
 */
public class Utils {
   private String senha;
   private ArrayList <Character> letrasMaiusculas;
   private ArrayList <Character> letrasMinusculas;
   private ArrayList <Character> numeros;
   private ArrayList <Character> simbolos;
   private int TamanhoDaSenha;
  
   
    public static String MSG_ERRO_SENHA_VAZIA = "ERRO_SENHA_VAZIA";
    // String necessária para remover colchetes, virgulas e espaços retornados pelas conversão de um ArrayList para uma String.
    private static final String REGEX_QUE_RETIRA_COLCHETES_VIRGULAS_ESPAÇOS = ",\\s|^\\[|\\]$";
   
    public Utils (String senha)throws appSenhaException{
        if(senha.isEmpty())
        {
            throw new appSenhaException (MSG_ERRO_SENHA_VAZIA);
        } 
        
        this.senha = senha;
        this.TamanhoDaSenha = this.senha.length();
        this.letrasMaiusculas = new ArrayList();
        this.letrasMinusculas = new ArrayList();
        this.numeros = new ArrayList();
        this.simbolos = new ArrayList();
        this.obterElementosDaSenha();
        
    }
       
    private boolean isLetraMaiuscula(char letra){
       return Character.isUpperCase(letra);       
    }
    
    private boolean isLetraMinuscula(char letra){
        return Character.isLowerCase(letra);
    }
    
    private boolean isNumero(char numero){
        return Character.isDigit(numero);
    }
    
    private void ApagarListas(){
        this.letrasMaiusculas.removeAll(this.letrasMinusculas);
        this.letrasMinusculas.removeAll(this.letrasMinusculas);
        this.numeros.removeAll(this.numeros);
        this.simbolos.removeAll(this.simbolos);
    }
 
    public void obterElementosDaSenha(){
        // Para aproveitar a instancia da classe na utilização de outras senhas, são apagadas as listas da classe.
        this.ApagarListas();
        
        for(int i=0; i<this.TamanhoDaSenha; i++)
        {
            if (this.isLetraMaiuscula(senha.charAt(i))) 
            {
                this.letrasMaiusculas.add(this.senha.charAt(i));
            }
            
            else if (this.isLetraMinuscula(senha.charAt(i))) 
            {
                this.letrasMinusculas.add(this.senha.charAt(i));
            }
            
            else if (this.isNumero(senha.charAt(i))) 
            {
                this.numeros.add(this.senha.charAt(i));
            }
            
            else 
            {
                this.simbolos.add(this.senha.charAt(i));
            }
            
        }
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
        this.obterElementosDaSenha();
    }

    public String getLetrasMaiusculas() {
        return this.letrasMaiusculas.toString().replaceAll(REGEX_QUE_RETIRA_COLCHETES_VIRGULAS_ESPAÇOS, "");
    }

    public String getLetrasMinusculas() {
        return this.letrasMinusculas.toString().replaceAll(REGEX_QUE_RETIRA_COLCHETES_VIRGULAS_ESPAÇOS, "");
    }

    public String getNumeros() {
        return this.numeros.toString().replaceAll(REGEX_QUE_RETIRA_COLCHETES_VIRGULAS_ESPAÇOS, "");
    }

    public String getSimbolos() {
        return this.simbolos.toString().replaceAll(REGEX_QUE_RETIRA_COLCHETES_VIRGULAS_ESPAÇOS, "");
    }
    
    public int getQuantidadeDeLetrasMaiusculas(){
        return this.letrasMaiusculas.size();
    }
    
    public int getQuantidadeDeLetrasMinusculas(){
        return this.letrasMinusculas.size();
    }
    
    public int getQuantidadeDeNumeros() {
        return this.numeros.size();
    }
    
    public int getQuantidadeDeSimbolos() {
        return this.simbolos.size();
    }
    
    public static String obterResultadoDaPontuacaoNoIntervalo(int pontuacao, int [] intervalos, String [] resultados){
       for(int i = 0; i < intervalos.length; i++)
       {
            if (pontuacao < intervalos[i])
            {
                return resultados[i];
            }
        }
        return null;
    }
    
    
    
}
